perm filename RUSS[AI,JMC] blob
sn#005454 filedate 1971-08-13 generic text, type T, neo UTF8
SKIPE COLOR
MOVEI T1,22
JRST KSIN
CAMG I,LLIM ;ARE THERE ANY
JRST RTVAL ;NO EVALUATE (RETURN VALUE FROM F.G.)
MOVEM I,ACTPT# ;SET POINTER TO LAST ACTIVE MOVE
MOVEM I,LLIM2# ;FOR THE USE OF FILL
LP: CAMG I,LLIM ;MAIN LOOP. ANY MOVES LEFT?
JRST ENDACT ;NO, END OF CHECKING FOR ACTIVITY
MOVE 2,(I) ;GET THE NEXT MOVE
JSR DOMOVE ;MAKE IT
PUSHJ P,FGMA ;DO A FORCED GAME FOR ACTIVITY CHECK
CAMLE THSVL ;IS IT ACTIVE MOVE
SOS ACTPT ;YES, COUNT IT
JSR UNMOVE ;RETRACT MOVE
MOVE 2,(I)
PUSHJ P,FILL ;PUT MOVE INTO TABLE
SOJA I,LP ;NEXT MOVE
ENDACT: MOVE I,ULIM ;NOW CHECK FOR LOSING. GET MOVE PTR
MOVE K,I ;POINTER FOR DEPOSITING
CAMG I,ACTPT ;ANY ACTIVE MOVES?
JRST NOACT ;NONE
LP2: CAMG I,ACTPT ;MAIN LOOP. MORE ACTIVE MOVES?
JRST DOPAS ;DO PASSIVE MOVES
MOVE 2,(I) ;GET A MOVE
MOVEM 2,(K) ;SAVE IT
JSR DOMOVE ;MAKE IT
PUSHJ P,FGML ;DO A FORCED GAME TO CHECK FOR LOSING
CAML BETA ;LOSING MOVE?
SUBI K,1 ;NO, KEEP IT
JSR UNMOVE ;RETRACT MOVE
SOJA I,LP2 ;NEXT ONE
DOPAS: MOVEI 2,1 ;HOW MANY PASSIVE MOVES?
MOVEM 2,PASCT ;SAVE IT
CAME K,ULIM ;ANY ACTIVE MOVES FOUND
JRST LP3 ;YES KEEP IT AT ONE
NOACT: MOVEI 2,3 ;NO ACTIVE MOVES
MOVEM 2,PASCT ;SO 3 PASSIVE ONES
LP3: CAMG I,LLIM ;ANY MOVES LEFT
JRST ENDMVS ;NO
MOVE 2,(I) ;GET MOVE
MOVEM 2,(K) ;SAVE IT
JSR DOMOVE ;MAKE IT
PUSHJ P,FGML ;CHECK FOR LOSING
CAML BETA ;IS IT LOSING
SUBI K,1 ;NO A GOOD ONE
JSR UNMOVE ;RETRACT MOVE
CAML BETA ;CHECK AGAIN
SOSE PASCT ;CHECK COUNT ONLY IF NOT LOSING
SOJA I,LP3 ;NEXT MOVE
HLRZ 2,1(K) ;GET VALUE OF LAST MOVE
HLRZ 3,-1(I) ;AND VALUE OF NEXT MOVE
CAME 2,3 ;SAME?
JRST ENDMVS ;YES
AOS PASCT ;GET ALL PASSIV OF SAME VALUE
SOJA I,LP3 ;CONTINUE
ENDMVS: MOVEM K,LLIM ;RESET LOWER LIMIT
ENDMVG: MOVE I,ULIM ;NOW TO CONTINUE TREE SEARCH
CAMG I,LLIM ;OUT OF MOVES (I.E. NONE THERE)
JRST RTVAL ;GIVE BACK THIS VALUE
LP4: CAMG I,LLIM ;OUT OF MOVES?
JRST RTBETA ;YES, RETURN BETA
MOVE 2,(I) ;GET THE NEXT MOVE
JSR DOMOVE ;MAKE IT
PUSH P,ALPHA ;SAVE THE WORLD
PUSH P,BETA
PUSH P,LEVEL
PUSH P,THSVL
PUSH P,COLOR
MOVN ALPHA ;INTERCHANGE ALPHA-BETA AND NEGATE
EXCH BETA
MOVNM ALPHA
MOVEI 2,20
XORM 2,COLOR ;CHANGE COLOR
PUSHJ P,MKMOV ;RECURSIVE CALL
POP P,COLOR
POP P,THSVL
POP P,LEVEL
POP P,BETA
POP P,ALPHA ;NOW YOU CAN HARDLY TELL WE WERE GONE
JSR UNMOVE ;RETRACT THAT MOVE
MOVNS ;NEGATE VALUE (ITS VALUE FOR OTHER COLOR)
CAMLE ALPHA ;COMPARE TO ALPHA
JRST RTALP ;TOO GOOD, WE COULDN'T GET HERE
CAMG BETA ;CHECK WITH BETA
SOJA I,LP4 ;NOT GOOD ENOUGH, TRY NEXT ONE
MOVEM BETA ;GOOD MOVE, REMEMBER IT
MOVE 2,(I) ;GET THAT MOVE
MOVE 3,LEVEL ;AND CURRENT LEVEL
MOVEM 2,MVTB(3) ;SAVE IT IN TABLE OF MOVES
CAME ALPHA ;IS BETA=ALPHA?
SOJA I,LP4 ;NO, NEXT MOVE
POPJ P, ;YES THIS MOVE AND VALUE ARE FINE
RTBETA: MOVE BETA ;VALUE OF THIS IS BETA
POPJ P,
RTALP: MOVE ALPHA ;RETURN ALPHA
POPJ P,
RTVAL: MOVE THSVL ;VALUE FROM F.G.
POPJ P,
;NOW THE ROUTINE TO DO FORCED GAMES
FGM1: SETZM ACGM# ;FLAG SAYING NOT ACTIVE GAME
MOVEI 2,CKLIM ;THE LIMIT ON CHECKS
MOVEM 2,CKSET# ;SAVE IT
FGM1E: PUSH P,ULIM ;RECURSIVE CALL TO HERE. SAVE WORLD
PUSH P,LLIM
PUSH P,BETA
PUSH P,ALPHA
MOVE 2,LLIM ;RESET ULIM
MOVEM 2,ULIM
PUSHJ P,GENMOV ;GET MOVES GENERATED
MOVE I,ULIM ;NOW LOOK AT THEM
CAMG I,LLIM ;IF ANY
JRST FEVAL ;GO EVALUATE
MOVE K,ULIM ;STORING POINTER
FLP1: CAMG I,LLIM ;ANY MOVES LEFT?
JRST GFG ;NO MAKE MOVES LEFT IN TREE
MOVE 2,COLOR ;SEE IF NOW IN CHECK
IORI 2,4 ;THIS IS OUR KING
SKIPLE ATT(2) ;IS HE ATTACKED
JRST NOWCK ;YES, IF IT GETS US OUT ITS GOOD
PUSH P,K ;SAVE K
MOVE 2,(I) ;GET THE MOVE
JSR GOMOVE ;MAKE IT
MOVE 2,COLOR ;NOW ARE WE IN CHECK?
IORI 2,4
SKIPLE ATT(2)
JRST NGFM ;YES, THIS ONE NO GOOD
MOVE 2,WCOUNT ;NOW CHECK VALUE
SUB 2,BCOUNT
SKIPE COLOR ;ARE WE DOING IT RIGHT WAY
MOVNS 2 ;NO, NEGATE
CAMLE 2,BETA ;IS IT GOOD
JRST OKFM ;YES A FORCED MOVE
SKIPG CKSET ;SHOULD WE TRY FOR CHECK
JRST NGFM ;NO SO NOT FORCED
MOVE 2,COLOR ;YES
XORI 2,24 ;MAKE IT HIS KING
SKIPG ATT(2) ;IS IT ATTACKED
JRST NGFM ;NO, LAST HOPE GONE
OKFM: SETZM OKMV# ;GOOD MOVE SET FLAG
SKIPA
NGFM: SETOM OKMV ;BAD MOVE
JSR UNMOVE ;RETRACT IT
POP P,K ;RESTOR STORE POINTER
SKIPE OKMV ;GOOD MOVE?
SOJA I,FLP1 ;NO, TRY AGAIN
MOVE 2,(I) ;GET THE MOVE
MOVEM 2,(K) ;SAVE IT
SUBI K,1 ;CHANGE K TO MATCH
SOJA I,FLP1 ;TRY FOR MORE
NOWCK: PUSH P,K ;SAVE K
MOVE 2,(I) ;GET MOVE
JSR GOMOVE ;MAKE IT
MOVE 2,COLOR ;SEE IF STILL IN CHECK
IORI 2,4
SKIPLE ATT(2)
JRST NGFM ;YES, BAD MOVE
JRST OKFM ;NO, GOOD MOVE
CFG: MOVEM K,LLIM ;READY TO GO DOWN TREE
MOVE I,ULIM ;GET POINTER
CAMG I,LLIM
JRST FEVAL ;CALL THE EVALUATOR
FLP2: CAMG I,LLIM ;ANY MOVES LEFT
JRST FRTBT ;NO RETURN BETA
MOVE 2,(I) ;GET MOVE
JSR GOMOVE ;DO IT
PUSH P,ALPHA ;SAVE THE WORLD
PUSH P,BETA
PUSH P,COLOR
PUSH P,CKSET
MOVN ALPHA ;EXCHANGE AND NEG. ALPHA- BETA
EXCH BETA
MOVNM ALPHA
MOVE 2,COLOR ;SEE IF SHOULD CHANGE CKSET
XORI 2,24 ;HIS KING
SKIPLE ATT(2) ;ATTACKED?
SOS CKSET ;YES CHANGE THIS
ANDI 2,20 ;CHANGE COLOR
MOVEM 2,COLOR ;HA. LUCKILY THE RIGHT THING IS AROUND
PUSH P,TVL ;SAVE SOME MORE
MOVE 2,[XWD 400000,1] ;LARGE AND NEGATIVE
MOVEM 2,TVL
PUSHJ P,FGM1E ;CONTINUE F.G.
MOVNS ;NEGATE VALUE
POP P,TVL ;RESTURE WORLD
POP P,CJSET
POP P,COLOR
POP P,BETA
POP P,ALPHA
SKIPE ACGM ;ACTIVE GAME
JRST ACVL ;YES SPECIAL VALUE JUDGEMENT
CAMG BETA ;SIMILAR TO THAT IN MAKMOV
JRST FGON
CAML ALPHA
JRST FRTALP
MOVEM BETA ;A GOOD MOVE TO REMEMBER
FGON: JSR UNMOVE ;RETRACT IT
SOJA I,FLP2 ;AND CONTINUE
FRTALP: JSR UNMOVE ;RETURN ALPHA AFTER RETRACTION
MOVE ALPHA
JRST FPOP ;GO RESTORE SAVED THINGS
FRTBT: MOVE BETA ;RETURNING BETA
SKIPE ACGM ;ACTIVE GAME
MOVE TVL ;THE RETURN TVL
FPOP: POP P,ALPHA
POP P,BETA
POP P,LLIM
POP P,ULIM
POPJ P, ;FINALLY
ACVL: CAMLE TVL ;ACTIVE EVALUATION
MOVEM TVL ;BETTER, SO SAVE
JRST FGON ;CONTINUE
;LOSING FORCED GAME
FGML: PUSH P,BETA
PUSH P,ALPHA
MOVN 2,THSVL
EXCH 2,ALPHA ;THIS BECOMES ALPHA (BECAUSE OF INVERSION)
MOVNM 2,BETA ;ALL SET NOW
PUSH P,COLOR ;BUT FOR THE COLOR
MOVEI 2,20
XORM 2,COLOR
PUSHJ P,FGM1 ;THE FORCED GAME
POP P,COLOR
POP P,ALPHA
POP P,BETA ;ALL RESTORED
MOVNS ;GET VALUE WITH PROPER SIGN
POPJ P,
;ACTIVE FORCED GAME
FFMA: PUSH P,BETA ;SAVE THINGS
PUSH P,ALPHA
MOVE 2,THSVL
MOVEM 2,BETA ;SET BETA
ADDI 2,400000 ;+1
MOVEM 2,ALPHA ;INTO ALPHA
SETOM ACGM# ;AN ACTIVE GAME
MOVE 2,[XWD 400000,1] ;LARGE AND NEGATIVE
MOVEM 2,TVL
PUSHJ P,FGM1+1 ;TO SKIP SETZM ACGM INSTR
POP P,ALPHA ;RESTORE
POP P,BETA
POPJ P, ;AND RETURN, NOTICE NO COLOR CHANGE
;GENERATE MOVES
GENMOV: MOVE I,ULIM ;GET POINTER FOR STORING
MOVE MOVER,COLOR ;GET COLOR (FIRST PIECE ON THIS SIDE)
HRLI MOVER,-20 ;20 PIECES
GMV1: MOVE K,KIND(MOVER) ;GET KIND OF THIS PIECE
JRST @GENTB(K) ;GO GENERATE RIGHT MOVERS
GENTB: EXP GPN,GQRB,GKN,GQRB,GQRB,GKI
GQRB: MOVE K,LM(MOVER) ;GET POINTER TO MOVE TABLE
HLRE M,K ;GET NUMBER OF DIRECTIONS
JRST PLG4 ;GET INTO LOOP
PLG2: ADDI K,10 ;GET NEXT DIR. IN MOVE TABLE
ANDI K,-10
PLG4: SKIPGE T1,MOVE(K) ;IS THERE A MOVE
JRST PLG3 ;NO SET FOR NEXT DIR
PLG1: ANDI T1,77 ;GET DESTINATION
SKIPGE T2,OCC(T1) ;SOMEONE THERE?
JRST .+4 ;NO, SO OK
XOR T2,MOVER ;SEE IF SAME COLOR
TRNN T2,20 ;IS IT?
JRST PLG3-2 ;YES, NOT A GOOD MOVE
MOVE T1,MOVE(K) ;GET THE MOVE AGAIN
MOVEM T1,(I) ;STORE IT
SUBI I,1 ;DECREMENT POINTER
SKIPL T1,MOVE+1(K) ;NEXT MOVE THERE?
AOJA K,PLG1 ;YES LOOK AT IT
PLG3: AOJL M,PLG2 ;TRY NEXT DIRECTION?
COMRG: AOBJN MOVER,GMV1 ;THIS ONE DONE TRY NEXT
PUSHJ P,KCAS ;ALL DONE, TRY CASTLE (KINGSIDE OK?)
JRST DOCS1 ;NO TRY QUEEN SIDE
MOVEI T1,KSCBT ;YES, SPECIAL FORMAT
MOVEM T1,(I) ;ITS A MOVE
SUBI I,1
DOCS1: PUSHJ P,QCAS ;QUEEN SIDE OK?
JRST DOCS2 ;NO
MOVEI T1,QSCBT ;THIS FORM OF MOVE
MOVEM T1,(I) ;STORE IT
SUBI I,1
DOCS2: MOVEM I,LLIM ;SAVE THE LOWER LIMIT
POPJ P, ;ALL MOVES GENERATED
;MOVES FOR KNIGHTS
GKN: MOVE K,LM(MOVER) ;GET POINTER TO MOVE TABLE
HRLI K,-10 ;FIRST 10 LOCATIONS HAVE MOVES
GKN2: SKIPGE T1,MOVE(K) ;IS THERE A MOVE THERE
JRST GKN1 ;NO
ANDI T1,77 ;SAME AS BEFORE WILL IT CAPTURE OWN PC.
SKIPGE T2,OCC(T1)
JRST .+4
XOR T2,MOVER
TRNN T2,20
JRST GKN1
MOVE T1,MOVE(K)
MOVEM T1,(I)
SUBI I,1
GKN1: AOBJN K,GKN2 ;TRY NEXT ONE
JRST COMRG ;ALL DONE GO TRY NEXT PIECE
;MOVES OF KING DO NOT LOOK AT CHECK
GKI: MOVE K,LM(MOVER) ;GET POINTER
SKIPGE T1,MOVE(K) ;CHECK MOVE
JRST GMVK1 ;NONE THERE
ANDI T1,77 ;LOOK FAMILIAR??
SKIPGE T2,OCC(T1)
JRST .+4
XOR T2,MOVER
TRNN T2,20
JRST GMVK1
MOVE T1,MOVE(K)
MOVEM T1,(I)
SUBI I,1
GMVK1: ADDI K,7 ;ONLY FIRST MOVE IN EACH DIR.
AOBJN K,GMVK+1
JRST COMRG
;PAWN MOVES
GPN: HRRZ K,LM(MOVER) ;GET POINTER
SKIPGE T1,MOVE(K) ;FIRST 4 MOVES. FIRST THERE?
JRST GMVP2 ;NO, CHECK NEXT
ANDI T1,77
SKIPGE T2,OCC(T1) ;OCCUPIED
JRST GMVP1P ;CHECK ENPASSANT
XOR T2,MOVER ;CHECK COLOR
TRNN T2,20
JRST GMVP2 ;WRONG COLOR
MOVE T2,RANK(T1) ;CHECK FOR PROMOTION
MOVE T1,MOVE(K) ;WILL WANT THIS ANYWAY
CAIE T2,0
CAIN T2,10
PUSHJ P,PROMP ;IF RANK 0 OR 10 PROMOTE
MOVEM T1,(I) ;NO PROMOTION, STORE MOVE
SUBI I,1
JRST GMVP2 ;CHECK NEXT
GMVP1P: TDNN FL,FOCC(T1) ;CHECK ENP. FLAGS
JRST GMVP2 ;NO SUCH LUCK
MOVE T2,RANK(T1) ;YES, MUST BE RIGHT COLOR
MOVE T1,MOVE(K) ;GET MOVE
TRO T1,ENPAS ;ITS ENPAS.
CAIE T2,0
CAIN T2,10
PUSHJ P,PROMP
MOVEM T1,(I)
SUBI I,1
;MAKE A MOVE. MOVE WILL BE IN AC 2
DOMOVE: 0
PUSH P,I ;SAVE ALL IMPORTANT THINGS
PUSH P,MOVED ;CELLS TELLING IF KINGS, ROOKS HAVE MOVED
PUSH P,MOVED+1
PUSH P,MOVED+2
PUSH P,MOVED+20
PUSH P,MOVED+21
PUSH P,MOVED+22
MOVEM 2,SV2# ;SAVE MOVE
TRZ FL,CAP+KSC+QSC+PROM ;TURN OFF FLAGS TELLING
;MOVE RETRACTOR THAT MOVE IS SPECIAL
TRNE 2,KSCBT ;KING SIDE CASTLE?
JRST KKSD ;YES
TRNE 2,QSCBT ;QUEEN SIDE?
JRST KQSD
TRNE 2,PROMBT ;PROMOTION
JRST PROMOT
TRNE 2,ENPAS ;EN PASSANT?
JRST ISENP
TRNE 2,ENPSET ;SET UP EN PAS
JRST SETENP
LDB DEST,[POINT 6,SV2,35] ;NORMAL, GET DEST
SKIPGE MOVER,OCC(DEST) ;OCCUPIED?
JRST UNOC ;NO
TRO FL,CAP ;IT'S A CAPTURE
PUSH P,DEST ;SAVE DEST
PUSH P,MOVER ;AND MOVER
MOVNI DEST,1 ;MOVE OFF BOARD
PUSHJ P,PUTCH ;DO IT
LDB DEST,[POINT 6,SV2,35] ;RESTORE DEST
UNOC: LDB MOVER,[POINT 5,SV2,29] ;GET MOVER
PUSH P,MOVER ;SAVE MOVER
PUSH P,LOC(MOVER) ;AND WHERE IT CAME FROM
PUSHJ P,PUTCH ;MAKE MOVE
PUSH P,FL ;SAVE FLAGS
JRST @DOMOVE ;RETURN
;SET UP FOR ENPAS
ENPSET: LDB MOVER,[POINT 5,SV2,29] ;GET MOVER
MOVE DEST,LM(MOVER) ;WANT LOC FOR E.P. CAPTURE
LDB DEST,[POINT 6,MOVE+2(DEST),35] ;GET THAT PLACE
MOVE DEST,FOCC(DEST) ;GET THE MAGIC BITS TO SET
MOVEM DEST,SVOCC# ;SAVE UNTIL AFTER MOVE
LDB DEST,[POINT 6,SV2,35] ;GET DEST
PUSH P,MOVER ;SAVE MOVER
PUSH P,LOC(MOVER) ;AND ORG
PUSHJ P,PUTCH ;MAKE MOVE
TDO FL,SVOCC ;SET E.P. BITS
PUSH P,FL ;SAVE FLAGS
JRST @DOMOVE ;RETURN
;E.P. CAPTURE
ISENP: LDB DEST,[POINT 6,SV2,35] ;GET DEST
MOVE DEST,ENP(DEST) ;USE SPECIAL TABLE FOR CAPT. LOC.
MOVE MOVER,OCC(DEST) ;GET PAWN CAPTURED
PUSH P,DEST ;SAVE
PUSH P,MOVER ;ALSO WHO
MOVNI DEST,1 ;MOVE OFF BOARD
PUSHJ P,PUTCH
TRO FL,CAP ;RESTORE SAME AS FOR CAPTURE
LDB DEST,[POINT 6,SV2,35] ;GET DEST
JRST UNOC ;SAME FROM HERE
;DO PROMOTIONS
PROMOT: TRO FL,PROM ;MAK AS PROMOTION
LDB MOVER,[POINT 5,SV2,29] ;GET MOVER
PUSH P,MOVER ;SAVE HIM
PUSH P,LOC(MOVER9 ;AND HIS LOCATION
MOVNI DEST,1 ;MOVE HIM OFF BOARD
PUSHJ P,PUTCH
PUSH P,LM(MOVER) ;SAVE OLD ENTRIES
PUSH P,KIND(MOVER)
MOVE T1,PCTB(MOVER) ;DISPLAY WORDS
PUSH P,1(T1)
PUSH P,2(T1)
LDB DEST,[POINT 2,SV2,19] ;GET NEW KIND
ADDI DEST,1 ;MAKE IT INTO CORRECT KIND
MOVEM DEST,KIND(MOVER) ;CHANGE KIND TABLE
SUBI DEST,1 ;MAGIC FOR PIECE SHAPE
IOR DEST,COLOR
MOVE DEST,PCTB(DEST) ;POINTER TO CORRECT SHAPE
MOVE 2,1(DEST)
MOVEM 2,1(T1)
MOVE 2,2(DEST)
MOVEM 2,2(T1)
LDB DEST,[POINT 2,SV2,19]
MOVEI T1,-10 ;CHANGE LM TABLE
CAIN DEST,1 ;KNIGHT?
MOVEI T1,7 ;YES
HRLM T1,LM(MOVER) ;CHANGE IT
LDB DEST,[POINT 6,SV2,35] ;GET DEST
PUSHJ P,PUTCH ;MAKE MOVE
PUSH P,FL ;SAVE FLAGS
JRST @DOMOVE ;RETURN
;CASTLE KING SIDE
KKSD: MOVE MOVER,COLOR ;GET COLOR
MOVE DEST,COLOR ;BOTH PLACES
IORI MOVER,4 ;KING
IORI DEST,6 ;RIGHT SQUARE
PUSH P,MOVER ;SAVE
PUSH P,DEST
PUSHJ P,PUTCH ;WILL MAKE CAPTURE RETURN WORK
MOVE MOVER,COLOR
MOVE DEST,COLOR
IORI MOVER,7 ;ROOK
IORI DEST,5
PUSH P,MOVER
PUSH P,DEST
PUSHJ P,PUTCH
TRO FL,CAP ;FAKE IT LIKE A CAPTURE
PUSH P,FL
JRST @DOMOVE
;CASTLE QUEEN SIDE
KQSD: MOVE MOVER,COLOR ;SAME AS ABOVE
MOVE DEST,COLOR
IORI MOVER,4
IORI MOVER,2
PUSH P,MOVER
PUSH P,DEST
PUSHJ P,PUTCH
MOVE MOVER,COLOR
MOVE DEST,COLOR
IORI DEST,3
PUSH P,MOVER
PUSH P,DEST
PUSHJ P,PUTCH
TRO FL,CAP
PUSH P,FL
JRST @DOMOVE
;CHECK FOR CASTLE POSSIBLE
KCAS: MOVE T1,COLOR ;KING SIDE
SKIPN MOVED(T1) ;KING MOVED?
SKIPE MOVED+1(T1) ;OR ROOK?
POPJ P, ;YES RETURN
SKIPLE ATT+4(T1) ;KING IN CHECK?
POPJ P, ;DON'T CASTLE
MOVEI T1,5 ;CHECK TO SEE IF CASTL THRU CHECK
SKIPE COLOR
MOVEI T1,25
KSIN: SKIPGE OCC(T1) ;OR MAYBE THRU A PIECE
SKIPL OCC+1(T1)
POPJ P,
HRLI T1,-20 ;CHECK BEARING TABLE
SKIPL T2,JBEAR(T1) ;ANYTHING?
PUSHJ P,FBR ;YES, CHECK IT OUT
ADDI T1,77 ;CHACK NEXT DIR
AOBJN T1,.-3 ;CONTINUE IF MORE
SUBI T1,1777 ;NEXT SQUARE
HRLI T1,-20 ;SAME AS ABOVE
SKIPL T2,JBEAR(T1)
PUSHJ P,FBR
ADDI T1,77
AOBJN T1,.-3
AOS (P) ;RETURN +1
POPJ P,
QCAS: MOVE T1,COLOR ;QUEEN SIDE
SKIPN MOVED(T1)
SKIPE MOVED+2(T1)
POPJ P, ;SOMEONE MOVED
SKIPLE ATT+4(T1) ;KING IN CHECK?
POPJ P,
MOVEI T1,2
;CHECK OF CHECKING
FBR: XOR T2,COLOR ;IS HE SAME COLOR
TRNN T2,20
POPJ P, ;YES, NO THREAT
MOVE T2,JBEAR(T1) ;GET HIM BACK
MOVE K,KIND(T2) ;WHAT KIND
CAIN K,PAWN
JRST PNCK ;PAWN
CAIN K,KING ;OR KING ARE SPECIAL
JRST KNGCK
CTCK: SUB P,[XWD 1,1]
POPJ P,
KNGCK: MOVE T2,LOC(T2) ;GET OTHER KINGS LOC
LDB T2,DISTBL(T2) ;GET DISTANCE
CAIE T2,1 ;ONLY WORRY IF 1
POPJ P,
JRST CTCK
PNCK: HRRZ K,T1 ;GET JBEAR PTR
MOVE T2,LM(T2) ;GET POINTER TO THAT PAWN'S MOVES
CAME K,MOVE(T2) ;MUST MATCH EITHER 1ST OR 2ND
CAMN K,MOVE+1(T2)
JRST CTCK
POPJ P,